package com.kk.datastructure.tree.foundactiontree;
/**
 * title: 顺序存储二叉树（前中后序遍历）
 * @author 阿K
 * 2021年1月1日 上午11:53:09 
 */
public class ArrBinaryTreeDemo {

	public static void main(String[] args) {
		int[] arr = { 1, 2, 3, 4, 5, 6, 7 };
		System.out.println("前序打印");
		new ArrBinaryTree(arr).perOrder();
		System.out.println("中序打印");
		new ArrBinaryTree(arr).infixOrder();
		System.out.println("后序打印");
		new ArrBinaryTree(arr).postOrder();
	}
}

// 顺序存储二叉树（前，中，后序遍历）
class ArrBinaryTree {

	private int[] data;// 存储数据节点的数组

	public ArrBinaryTree(int[] data) {
		this.data = data;
	}

	// 重载前序遍历(直接调用这个，方便）
	public void perOrder() {
		this.perOrder(0);
	}
	// 重载中序遍历(直接调用这个，方便）
	public void infixOrder() {
		this.infixOrder(0);
	}
	// 重载后序遍历(直接调用这个，方便）
	public void postOrder() {
		this.postOrder(0);
	}

	/**
	 * 顺序存储二叉树的前序遍历
	 * 
	 * @param index 数组的下标
	 */
	public void perOrder(int index) {
		// 判空
		if (data == null && data.length == 0) {
			System.out.println("数组为空，不能按照前序遍历为二叉树哦~~");
		}
		// 输出当前元素，用于查看
		System.out.printf("当前输出节点：%s\n", data[index]);

		// 注：以下左右递归的推导，在思路上有体现
		// 向左递归遍历
		if (index * 2 + 1 < data.length) {
			perOrder(index * 2 + 1);
		}
		// 向右递归遍历
		if (index * 2 + 2 < data.length) {
			perOrder(index * 2 + 2);
		}
	}

	/**
	 * 顺序存储二叉树的中序遍历
	 * 
	 * @param index 数组的下标
	 */
	public void infixOrder(int index) {
		// 判空
		if (data == null && data.length == 0) {
			System.out.println("数组为空，不能按照前序遍历为二叉树哦~~");
		}

		// 注：以下左右递归的推导，在思路上有体现
		// 向左递归遍历
		if (index * 2 + 1 < data.length) {
			infixOrder(index * 2 + 1);
		}
		// 输出当前元素，用于查看
		System.out.printf("当前输出节点：%s\n", data[index]);
		
		// 向右递归遍历
		if (index * 2 + 2 < data.length) {
			infixOrder(index * 2 + 2);
		}
	}

	/**
	 * 顺序存储二叉树的后序遍历
	 * 
	 * @param index 数组的下标
	 */
	public void postOrder(int index) {
		// 判空
		if (data == null && data.length == 0) {
			System.out.println("数组为空，不能按照前序遍历为二叉树哦~~");
		}

		// 注：以下左右递归的推导，在思路上有体现
		// 向左递归遍历
		if (index * 2 + 1 < data.length) {
			postOrder(index * 2 + 1);
		}
		// 向右递归遍历
		if (index * 2 + 2 < data.length) {
			postOrder(index * 2 + 2);
		}
		// 输出当前元素，用于查看
		System.out.printf("当前输出节点：%s\n", data[index]);

	}

}
